package workgroup.osaka;

import java.util.Calendar;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Vibrator;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.Toast;

public class DoAlarmActivity extends Activity {
    private final String TAG = "DoAlarmActivity";
    private AlarmInfo m_alarmInfo;
    private MediaPlayer m_player;
    private Vibrator m_vibrator;
    private long m_vibrationPtn[] = {1000, 200, 700, 200, 400, 200};
    private final int REQUEST_CODE_ROOP = 0;      // スヌーズ 識別コード

    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 通常画面(main.xml)の表示
        setContentView(R.layout.do_alarm);

        // Intentから画面遷移時のデータを取得
        // ・mAlarmInfoを登録
        Intent intent = getIntent();
        m_alarmInfo = (AlarmInfo)intent.getSerializableExtra("alarm");
        if (m_alarmInfo == null) {
            // ここに来る事はないはず
            Log.e(TAG, "アラーム情報がない");
            m_alarmInfo = new AlarmInfo(this);
        }
        Log.v(TAG, m_alarmInfo.getAlarmTime() + " " + m_alarmInfo.getAlarmVol() + m_alarmInfo.getRepeatingDay() + " " + m_alarmInfo.getSnoozeInterval() + " " + m_alarmInfo.getSnoozeInterval() + m_alarmInfo.getAlarmOn() + m_alarmInfo.getHolidayAlarmStop() + m_alarmInfo.getVibration());

        // 音を鳴らす
        m_player = new MediaPlayer();
        Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);

        m_player.setAudioStreamType(AudioManager.STREAM_ALARM); // アラーム音として設定
        m_player.setLooping(true);    // 鳴動を繰り返す
        m_player.setVolume(m_alarmInfo.getAlarmVol(), m_alarmInfo.getAlarmVol()); // 音量を設定する
        if (uri == null) {
            // サイレント
        } else {
            try {
                m_player.setDataSource(this, uri);
                m_player.prepare();
                m_player.start();
            } catch (Exception e) {
                Log.e(TAG, "アラーム音鳴動エラー", e);
            }
        }
        // バイブレーションを動作する
        m_vibrator = (Vibrator)getSystemService(VIBRATOR_SERVICE);
        if (m_alarmInfo.getVibration() == true) {
            m_vibrator.vibrate(m_vibrationPtn, 0);
        }
      
        // スヌーズボタン
        Button snoozeBtn = (Button)findViewById(R.id.snoozeBtn);
        snoozeBtn.setText("スヌーズ\n" + Integer.toString(m_alarmInfo.getSnoozeInterval()) + getString(R.string.minute));
        OnClickListener snoozeListener = new OnClickListener() {
            public void onClick(View view) {
                // アラームストップ
                stopAlarm();
                // snoozeアラーム設定
                startSnooze(m_alarmInfo);
                // ボタンを押せないようにする
                Button btn = (Button)view;
                btn.setEnabled(false);
                // 停止ボタンを動かないようにする
                SeekBar stopSeekBar = (SeekBar)findViewById(R.id.stopAlarm_seekBar);
                stopSeekBar.setEnabled(false);
            }
        };
        snoozeBtn.setOnClickListener(snoozeListener);
        // 停止ボタン
        SeekBar stopSeekBar = (SeekBar)findViewById(R.id.stopAlarm_seekBar);
        OnSeekBarChangeListener stopListener = new OnSeekBarChangeListener() {

            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                // seekを最大に動かしたら停止する
                if (progress == seekBar.getMax()) {
                    stopAlarm();
                    // seekを動かせないようにする
                    seekBar.setEnabled(false);
                    // スヌーズボタンを押せないようにする
                    Button snoozeBtn = (Button)findViewById(R.id.snoozeBtn);
                    snoozeBtn.setEnabled(false);
                    
                    // アラーム情報の繰り返し設定がない場合、アラームOFFに設定する
                    /*
                     * if (m_alarmInfo.getRepeatingDay() == "　　　　　　　") {
                     * では true にならない。
                     * JavaでStringを比較するならば equals(String)メソッドを使う
                     */
                    if (m_alarmInfo.getRepeatingDay().equals("　　　　　　　") ) {
                        m_alarmInfo.setAlarmOn(false);
                    }
                    // 通常画面に遷移
                    startAlarmActivity(m_alarmInfo);
                }
            }
            public void onStartTrackingTouch(SeekBar seekBar) {
            }
            public void onStopTrackingTouch(SeekBar seekBar) {
                // seekが最大でない場合、0に戻す
                if (seekBar.getProgress() != seekBar.getMax()) {
                    seekBar.setProgress(0);
                }
            }
        };
        stopSeekBar.setOnSeekBarChangeListener(stopListener);

    }
    /***************************************
     * アラーム通常画面（AlarmActivity) 遷移処理.
     * <p>
     * アラーム通常画面に遷移する
     * </p>
     * @param info 通常画面に送るアラーム情報
     *****************************************/
    private void startAlarmActivity(AlarmInfo info) {
        Intent intent = new Intent(DoAlarmActivity.this, AlarmActivity.class);
        //AlarmActivityに送るリクエストコード
        int requestcode = AlarmActivity.REQUEST_CODE_FOR_DO;
        intent.putExtra("requestcode_do", requestcode);
        //AlarmActivityに送るAlarmInfo
        intent.putExtra("alarm", info);
        try {
            startActivity(intent);
        } catch (Exception e) {
            Toast.makeText(DoAlarmActivity.this, "画面遷移に失敗しました。", Toast.LENGTH_SHORT)
                    .show();
            Log.e(TAG, "詳細画面遷移エラー", e);
        }
    }
    /****************************************************************************
     * 音・バイブレーション 停止.
     ******************************************************************************/ 
    private void stopAlarm() {
        // 音停止
        if (m_player.isPlaying()) {         
            m_player.stop();            
        }
        m_player.release();
        
        // バイブレーション停止
        m_vibrator.cancel();
    }
    
    /***************************************
     * アラームを設定する.
     * <p>
     * AlarmManagerにアラームとアラーム鳴動画面を設定する。
     * </p>
     * @param alarm 設定する次アラーム
     *****************************************/
    private void startSnooze(AlarmInfo info) {
        // AlarmManagerの取得
        AlarmManager alarmMng = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        
        // sneeze間隔による、次のアラーム時刻決定
        Calendar now = Calendar.getInstance();
        long nextAlarm = now.getTimeInMillis() + (info.getSnoozeInterval() * 1000 * 60);
        
        
        // アラームを登録
        alarmMng.set(AlarmManager.RTC_WAKEUP,
                nextAlarm, getPendingIntentOfStartDoAlarm(info));
    }
    
    /****************************************
     * アラーム鳴動画面への画面遷移呼び出し設定の取得（PendingIntent).
     * @param info アラーム鳴動画面へ引き渡すアラーム情報
     *****************************************/
    private PendingIntent getPendingIntentOfStartDoAlarm(AlarmInfo info) {
        // アラーム鳴動画面への遷移インテントを設定する
        Intent intent = new Intent(this, DoAlarmActivity.class);
        intent.putExtra("alarm", info);

        // PendingIntent作成
        PendingIntent pendingIntent = PendingIntent.getActivity(this, REQUEST_CODE_ROOP, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        return pendingIntent;
    }
    
    /****************************************
     * アラーム鳴動中の戻るボタンの仕様を制限する
     * @param event 押されたボタンがeventに入る
     *****************************************/
    
    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        
        if (event.getAction()==KeyEvent.ACTION_DOWN) {
            switch (event.getKeyCode()) {
            case KeyEvent.KEYCODE_BACK:
                //戻るボタンが押されたら何もせずにtrueを返す
                return true;
            }
        }
        return super.dispatchKeyEvent(event);
    }
    
}